//
//  FX7Shader.metal
//  YCCamera
//
//  FX7 滤镜的 Metal 着色器（简化版，用于调试）
//

#include <metal_stdlib>
using namespace metal;

/// 从 PNG LUT 纹理中采样颜色（最近邻，无插值）
/// PNG 格式：512×512，8×8 布局，64³ 精度
float3 sampleLUTSimple(texture2d<float, access::sample> lutTexture, float3 color) {
    const int dimension = 64;
    const int blocksPerRow = 8;
    
    // 将输入颜色映射到 LUT 坐标 [0, 63]
    int3 coord = int3(color * float(dimension - 1) + 0.5);
    coord = clamp(coord, int3(0), int3(dimension - 1));
    
    int r = coord.r;
    int g = coord.g;
    int b = coord.b;
    
    // 计算方块位置（基于蓝色通道）
    int blockX = (b % blocksPerRow) * dimension;
    int blockY = (b / blocksPerRow) * dimension;
    
    // 方块内的位置
    int px = blockX + r;
    int py = blockY + g;
    
    // 创建采样器（归一化坐标）
    constexpr sampler textureSampler(
        coord::normalized,
        address::clamp_to_edge,
        filter::nearest
    );
    
    // 计算归一化坐标（像素中心）
    float2 texCoord = float2(
        (float(px) + 0.5) / 512.0,
        (float(py) + 0.5) / 512.0
    );
    
    // 采样
    float4 lutColor = lutTexture.sample(textureSampler, texCoord);
    
    return lutColor.rgb;
}

/// FX7 LUT 滤镜着色器（简化版，最近邻采样）
kernel void fx7LUTFilter(
    texture2d<float, access::read> inTexture [[texture(0)]],
    texture2d<float, access::write> outTexture [[texture(1)]],
    texture2d<float, access::sample> lutTexture [[texture(2)]],
    constant float *strength [[buffer(0)]],
    uint2 gid [[thread_position_in_grid]])
{
    // 检查边界
    if (gid.x >= outTexture.get_width() || gid.y >= outTexture.get_height()) {
        return;
    }
    
    // 读取原始颜色
    float4 originalColor = inTexture.read(gid);
    
    // 应用 LUT
    float3 lutColor = sampleLUTSimple(lutTexture, originalColor.rgb);
    
    // 根据强度混合
    float3 finalColor = mix(originalColor.rgb, lutColor, *strength);
    
    // 写入结果
    outTexture.write(float4(finalColor, originalColor.a), gid);
}

